home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / game / board / Exchess.lha / EXChess / attacks.cpp next >
C/C++ Source or Header  |  1998-02-10  |  6KB  |  243 lines

  1. /* Attack functions */
  2.  
  3. #include "chess.h"
  4. #include "define.h"
  5. #include "funct.h"
  6. #include "const.h"
  7.  
  8. int knt_attacks(int sq, position *p, int side, int one);
  9. int dia_attacks(int sq, position *p, int side, int one);
  10. int hor_attacks(int sq, position *p, int side, int one);
  11.  
  12. /*---------------- Driver to calculate Attacks --------------*/
  13. // If the "one" parameter is true, this means we only need
  14. // to find one attack, then exit.  "side" is the side which
  15. // is doing the attacking.
  16. int attacks(int sq, position *p, int side, int one)
  17. {
  18.   int attacks = 0;
  19.  
  20.   attacks += dia_attacks(sq, p, side, one);
  21.   if(attacks && one) return 1;
  22.   attacks += hor_attacks(sq, p, side, one);
  23.   if(attacks && one) return 1;
  24.   attacks += knt_attacks(sq, p, side, one);
  25.  
  26.   return attacks;
  27. }
  28.  
  29. /*----------------- Calculate diagonal attacks ------------------*/
  30.  
  31. int dia_attacks(int sq, position *p, int side, int one)
  32. {
  33.   int attacks = 0, other = side^1, mm = FILE(sq), nn = RANK(sq), tsq;
  34.  
  35.   int ii = 1;
  36.   while (mm + ii <= 7 && nn + ii <= 7)
  37.   {
  38.    tsq = SQR((mm+ii),(nn+ii));
  39.    if (p->sq[tsq].side == side)
  40.    {
  41.     if (ii == 1 && ID(p->sq[tsq]) == BPAWN)
  42.     { if(one) return 1; attacks++; }
  43.     else if (ii == 1 && p->sq[tsq].type == KING)
  44.     { if(one) return 1; attacks++; }
  45.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == BISHOP)
  46.     { if(one) return 1; attacks++; }
  47.     break;
  48.    }
  49.    if (p->sq[tsq].side == other) break;
  50.    ii++;
  51.   }
  52.  
  53.   ii = 1;
  54.   while ((mm - ii) >= 0 && nn + ii <= 7)
  55.   {
  56.    tsq = SQR((mm-ii),(nn+ii));
  57.    if (p->sq[tsq].side == side)
  58.    {
  59.     if (ii == 1 && ID(p->sq[tsq]) == BPAWN)
  60.     { if(one) return 1; attacks++; }
  61.     else if (ii == 1 && p->sq[tsq].type == KING)
  62.     { if(one) return 1; attacks++; }
  63.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == BISHOP)
  64.     { if(one) return 1; attacks++; }
  65.     break;
  66.    }
  67.    if (p->sq[tsq].side == other) break;
  68.    ii++;
  69.   }
  70.  
  71.   ii = 1;
  72.   while ((mm - ii) >= 0 && (nn - ii) >= 0)
  73.   {
  74.    tsq = SQR((mm-ii),(nn-ii));
  75.    if (p->sq[tsq].side == side)
  76.    {
  77.     if (ii == 1 && ID(p->sq[tsq]) == WPAWN)
  78.     { if(one) return 1; attacks++; }
  79.     else if (ii == 1 && p->sq[tsq].type == KING)
  80.     { if(one) return 1; attacks++; }
  81.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == BISHOP)
  82.     { if(one) return 1; attacks++; }
  83.     break;
  84.    }
  85.    if (p->sq[tsq].side == other) break;
  86.    ii++;
  87.   }
  88.  
  89.   ii = 1;
  90.   while (mm + ii <= 7 && nn - ii >= 0)
  91.   {
  92.    tsq = SQR((mm+ii),(nn-ii));
  93.    if (p->sq[tsq].side == side)
  94.    {
  95.     if (ii == 1 && ID(p->sq[tsq]) == WPAWN)
  96.     { if(one) return 1; attacks++; }
  97.     else if (ii == 1 && p->sq[tsq].type == KING)
  98.     { if(one) return 1; attacks++; }
  99.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == BISHOP)
  100.     { if(one) return 1; attacks++; }
  101.     break;
  102.    }
  103.    if (p->sq[tsq].side == other) break;
  104.    ii++;
  105.   }
  106.  
  107.  
  108.   return attacks;
  109. }
  110.  
  111. /*----------------- Calculate Horizontal attacks ------------------*/
  112.  
  113. int hor_attacks(int sq, position *p, int side, int one)
  114. {
  115.   int attacks = 0, other = side^1, mm = FILE(sq), nn = RANK(sq), tsq;
  116.  
  117.   int ii = 1;
  118.   while (mm + ii <= 7)
  119.   {
  120.    tsq = SQR((mm+ii), nn);
  121.    if (p->sq[tsq].side == side)
  122.    {
  123.     if (ii == 1 && p->sq[tsq].type == KING)
  124.     { if(one) return 1; attacks++; }
  125.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == ROOK)
  126.     { if(one) return 1; attacks++; }
  127.     break;
  128.    }
  129.    if (p->sq[tsq].side == other) break;
  130.    ii++;
  131.   }
  132.  
  133.   ii = 1;
  134.   while ((mm - ii) >= 0)
  135.   {
  136.    tsq = SQR((mm-ii), nn);
  137.    if (p->sq[tsq].side == side)
  138.    {
  139.     if (ii == 1 && p->sq[tsq].type == KING)
  140.     { if(one) return 1; attacks++; }
  141.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == ROOK)
  142.     { if(one) return 1; attacks++; }
  143.     break;
  144.    }
  145.    if (p->sq[tsq].side == other) break;
  146.    ii++;
  147.   }
  148.  
  149.   ii = 1;
  150.   while (nn - ii >= 0)
  151.   {
  152.    tsq = SQR((mm),(nn-ii));
  153.    if (p->sq[tsq].side == side)
  154.    {
  155.     if (ii == 1 && p->sq[tsq].type == KING)
  156.     { if(one) return 1; attacks++; }
  157.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == ROOK)
  158.     { if(one) return 1; attacks++; }
  159.     break;
  160.    }
  161.    if (p->sq[tsq].side == other) break;
  162.    ii++;
  163.   }
  164.  
  165.   ii = 1;
  166.   while (nn + ii <= 7)
  167.   {
  168.    tsq = SQR((mm),(nn+ii));
  169.    if (p->sq[tsq].side == side)
  170.    {
  171.     if (ii == 1 && p->sq[tsq].type == KING)
  172.     { if(one) return 1; attacks++; }
  173.     else if (p->sq[tsq].type == QUEEN || p->sq[tsq].type == ROOK)
  174.     { if(one) return 1; attacks++; }
  175.     break;
  176.    }
  177.    if (p->sq[tsq].side == other) break;
  178.    ii++;
  179.   }
  180.  
  181.  
  182.   return attacks;
  183. }
  184.  
  185. /*------------------------ Knight Attacks Counted -------------------*/
  186. int knt_attacks(int sq, position *p, int side, int one)
  187. {
  188.   int self = side^1;
  189.   int tsq, attacks = 0;
  190.  
  191.   if(FILE(sq) < 6 && RANK(sq) < 7) {
  192.    tsq = sq + 10;
  193.    if(p->sq[tsq].side != self) {
  194.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  195.     }
  196.   }
  197.   if(FILE(sq) < 6 && RANK(sq)) {
  198.    tsq = sq - 6;
  199.    if(p->sq[tsq].side != self) {
  200.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  201.     }
  202.   }
  203.   if(FILE(sq) > 1 && RANK(sq) < 7) {
  204.    tsq = sq + 6;
  205.    if(p->sq[tsq].side != self) {
  206.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  207.     }
  208.   }
  209.   if(FILE(sq) > 1 && RANK(sq)) {
  210.    tsq = sq - 10;
  211.    if(p->sq[tsq].side != self) {
  212.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  213.     }
  214.   }
  215.   if(FILE(sq) < 7 && RANK(sq) < 6) {
  216.    tsq = sq + 17;
  217.    if(p->sq[tsq].side != self) {
  218.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  219.     }
  220.   }
  221.   if(FILE(sq) && RANK(sq) < 6) {
  222.    tsq = sq + 15;
  223.    if(p->sq[tsq].side != self) {
  224.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  225.     }
  226.   }
  227.   if(FILE(sq) < 7 && RANK(sq) > 1) {
  228.    tsq = sq - 15;
  229.    if(p->sq[tsq].side != self) {
  230.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  231.     }
  232.   }
  233.   if(FILE(sq) && RANK(sq) > 1) {
  234.    tsq = sq - 17;
  235.    if(p->sq[tsq].side != self) {
  236.      if(p->sq[tsq].type == KNIGHT) { if(one) return 1; attacks++; }
  237.     }
  238.   }
  239.  
  240.  return attacks;
  241. }
  242.  
  243.